import openai
import os
from typing import Optional, Dict, Any
from app.core.config import settings
from openai import OpenAI

class AIClient:
    """大语言模型API客户端"""
    
    def __init__(self):
        # 初始化OpenAI客户端
        self.client = OpenAI(api_key=settings.OPENAI_API_KEY)
        self.model = settings.OPENAI_MODEL
    
    def _generate_prompt(self, system_prompt: str, user_prompt: str) -> list:
        """生成标准的prompt格式"""
        return [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ]
    
    def generate_text(self, 
                      system_prompt: str, 
                      user_prompt: str, 
                      temperature: float = 0.7, 
                      max_tokens: int = 1000,
                      **kwargs) -> Optional[str]:
        """
        调用LLM生成文本内容
        
        Args:
            system_prompt: 系统提示词，定义AI的角色和任务
            user_prompt: 用户输入的内容
            temperature: 生成多样性控制参数
            max_tokens: 最大生成token数
            **kwargs: 其他OpenAI API参数
        
        Returns:
            生成的文本内容
        """
        try:
            response = self.client.chat.completions.create(
                model=self.model,
                messages=self._generate_prompt(system_prompt, user_prompt),
                temperature=temperature,
                max_tokens=max_tokens,
                **kwargs
            )
            return response.choices[0].message.content
        except Exception as e:
            print(f"AI生成文本失败: {str(e)}")
            return None
    
    def analyze_job_description(self, jd_content: str) -> Optional[Dict[str, Any]]:
        """
        分析职位描述，提取关键信息
        
        Args:
            jd_content: 职位描述文本
        
        Returns:
            包含职位要求、技能等信息的字典
        """
        system_prompt = "你是一位专业的人力资源分析师，擅长从职位描述中提取关键信息。"
        user_prompt = f"请分析以下职位描述，提取关键的技能要求、经验要求、岗位职责等信息，并以结构化的JSON格式输出。\n职位描述：{jd_content}"
        
        result = self.generate_text(system_prompt, user_prompt)
        
        # 处理JSON格式结果
        if result:
            try:
                import json
                return json.loads(result)
            except json.JSONDecodeError:
                print(f"解析AI返回的JSON失败: {result}")
                return {"analysis_text": result}
        
        return None
    
    def optimize_resume_content(self, resume_content: str, jd_content: str, optimization_type: str = "full") -> Optional[str]:
        """
        根据职位描述优化简历内容
        
        Args:
            resume_content: 原始简历内容
            jd_content: 职位描述文本
            optimization_type: 优化类型，可选值: full(整体优化), experience(经验优化), skills(技能优化), summary(总结优化)
        
        Returns:
            优化后的简历内容
        """
        system_prompt = "你是一位专业的简历优化顾问，擅长根据职位要求优化简历内容。"
        
        optimization_prompts = {
            "full": f"""请根据以下职位描述，全面优化这份简历，使其更匹配目标职位，突出相关技能和经验。
职位描述：{jd_content}
简历内容：{resume_content}""",
            "experience": f"""请根据以下职位描述，重点优化简历中的工作/实习经验部分，使用STAR法则（情境-任务-行动-结果）进行表述。
职位描述：{jd_content}
简历内容：{resume_content}""",
            "skills": f"""请根据以下职位描述，优化简历中的技能部分，突出与目标职位相关的关键技能。
职位描述：{jd_content}
简历内容：{resume_content}""",
            "summary": f"""请根据以下职位描述，优化简历中的个人总结部分，使其更具吸引力和针对性。
职位描述：{jd_content}
简历内容：{resume_content}"""
        }
        
        user_prompt = optimization_prompts.get(optimization_type, optimization_prompts["full"])
        
        return self.generate_text(system_prompt, user_prompt)
    
    def generate_resume_summary(self, resume_content: str) -> Optional[str]:
        """
        根据简历内容生成专业的个人总结
        
        Args:
            resume_content: 简历内容
        
        Returns:
            生成的个人总结
        """
        system_prompt = "你是一位专业的职业顾问，擅长根据个人经历生成简洁有力的个人总结。"
        user_prompt = f"请根据以下简历内容，生成一段专业、简洁的个人总结，突出核心优势和职业目标。\n简历内容：{resume_content}"
        
        return self.generate_text(system_prompt, user_prompt)
    
    def suggest_keywords(self, resume_content: str, jd_content: str) -> Optional[list]:
        """
        根据简历和职位描述，推荐应该包含的关键词
        
        Args:
            resume_content: 简历内容
            jd_content: 职位描述
        
        Returns:
            关键词列表
        """
        system_prompt = "你是一位专业的ATS简历优化专家，擅长识别简历中缺失的关键关键词。"
        user_prompt = f"请分析以下简历和职位描述，找出简历中应该包含但缺失的关键词，并以列表形式返回。\n职位描述：{jd_content}\n简历内容：{resume_content}"
        
        result = self.generate_text(system_prompt, user_prompt)
        
        # 处理列表格式结果
        if result:
            try:
                import json
                return json.loads(result)
            except json.JSONDecodeError:
                # 尝试提取文本中的关键词
                import re
                keywords = re.findall(r'\b\w+\b', result)
                return keywords
        
        return []

# 创建全局AI客户端实例
ai_client = AIClient()